import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.*;
import java.awt.*;
/**
 *@author: tovar vazquez cesar* 
 */
public class space extends World
{
    public int niv=1;   
    private static final String scoreLabel = "Felicidades pasaste de nivel";
    
    private GreenfootImage box;
    //aqui se crean los objetos
    public Win Win = new Win();// se crea el mensaje de ganaste
    public puerta puerta=new  puerta();//se crea la puerta
    public p1 p1 = new p1();// se crea la proteccion 1
    public p2 p2 = new p2();// se crea la proteccion 2
    public p3 p3 = new p3();// se crea la proteccion 3
    public heroe heroe=new  heroe();// se crea el heroe
    public Nivel nivel=new Nivel();// se crea el mensaje de nivel
    public panel panel =new panel();//se crea el mensaje de las vidas 
    public llave llave =new llave();// se crea el mensaje de cuantos objetos llevas recolectados
    public muestranivel muestra= new muestranivel();//se crea el mensaje de en que nivel vas
    public int on=0;//variable para activar la creacion de los objetos en cada nivel
    public int pt1=0;//variables de proteccion
    public int pt2=0;//variables de proteccion
    public int pt3=0;//variables de proteccion 
    private int num = 3; //numero de asteriodes
    public int cont=0;//contador para saber cuantos objetos a recolectado y pasar de nivel
    public int lives = 7; //contador de las vidas del jugador
    public int gx=0; //coordenada x de los enemigos
    public int px=0; //coordenada x de los poderes
    public int py=0; //coordenada y de los poderes
    public int pb=0; //contador del numero de poderes
    public int set=0; //variable para saber cuando eliminar el objeto que muestra un mesje
    public int wait=0; //variable para esperar antes de elimar el mensaje
    public int over=0; //para saber si se termino el juego
    private boolean i = false; //para saber si se empiesa el juego
    public int door=0;//variable para checar si aun no has destruido la puerta
    private Boton jugar = new Boton("play.png");//Boton Jugar
    private Boton ayuda = new Boton("ayuda.png");//Boton Ayuda
    private Boton creditos = new Boton("creaditos.png");//Boton Creditos
    private Boton atras = new Boton("backbutton.png");//Boton Atras 
    
    /**Constructor del escenario*/
    public space()
    {    
        // crea el nuevo mundo de 700 por 600.
        super(700, 600, 1);
        cargaMenu();
    }
    public void act()
    {
      if(i)
      {//random para que se agrege un poder al azar
        if(Greenfoot.getRandomNumber(5)==4) 
        {
             addpoder();
             addObjeto();
        }
        
           if(set==1) 
           {
               if(wait==100)
              {
                   removeObject(nivel);
                   wait=0;
                   set=0;
              }
        else
          wait++;
        
           }
        //aqui agrega la proteccion segun el poder que hallas agarrado
        if(pt1==1)
            addObject(p1,600,490);
        
            if(pt2==1)
                addObject(p2,600,510);
        
                if(pt3==1)
                    addObject(p3,600,540);
                    
        //crea el segundo nivel                    
        if(niv==2&&on==0)
        {
            removeObject(Win);
            addObject(puerta,600,580);
            addObject(nivel,400,300);
            addPoder1();
            addEnemigo1(15);
            addEnemigo2(15);
            addPoder2();
            addPoder3();
            addObjeto1();
            addObjeto2();
            addObjeto3();
            set=1;
            on=1;;
        } 
        //crea el tercer nivel
        if(niv==3&&on==1)
        {
            removeObject(Win);
            addObject(nivel,400,300);
            addPoder1();
            addEnemigo1(10);
            addPoder2();
            addEnemigo2(10);
            addEnemigo3(10);
            addPoder3();            
            addObjeto1();
            addObjeto2();
            addObjeto3();
            set=1;
            on=2;
        }
        //crea el cuarto nivel
        if(niv==4&&on==2)
        {
            removeObject(Win);
            addObject(nivel,400,300);
            addPoder1();
            addPoder2();
            addPoder3();
            addEnemigo1(5);
            addEnemigo2(5);
            addEnemigo3(5);
            addPoder4();
            if(Greenfoot.getRandomNumber(50)==10) 
            addPoder4();
            set=1;
            on=4;
        }
        //checa si interceptas la puerta y avanza de nivel
        if(door==2)
        {
             addObject(Win,400,300);
             door=0;
             niv=niv+1;
        }
        //si llegaste al nivel 5 indica que el juego se acabo
        if(niv==5)
         {
                addObject(Win,400,300);
                over=1;
                Greenfoot.playSound("buzz.wav");
                Greenfoot.stop();
                //cargaMenu();                
          }
          //se se te acabaron las vidas o destruyen la puerta se acaba el juego
        if(lives<=0&&over==0||door==1&&over==0)
        {
            addObject(new Gameover(),400,300);
            over=1;
            
            Greenfoot.playSound("buzz.wav");
            Greenfoot.stop();
        }
    }
    checaBotones(); 
}

    //se encarga de agregar los enmigos de tipo 2  
    private void addEnemigo1(int count)
    {
        for(int i = 0; i < count; i++)
        {
          int x = Greenfoot.getRandomNumber(getWidth());
          int y = Greenfoot.getRandomNumber(getHeight()/2);
          addObject(new m1(), x, y);
        }
    }
    
    //se encarga de agregar los enmigos de tipo 1 
    private void addEnemigo2(int count)
    {
        for(int i = 0; i < count; i++)
        {
        int x = Greenfoot.getRandomNumber(getWidth()-1);
        int y = Greenfoot.getRandomNumber(getHeight()/2);
        addObject(new m2(), x, y);
    }
    }
    
    //se encarga de agregar los enmigos de tipo 3
    private void addEnemigo3(int count)
    {
        for(int i = 0; i < count; i++)
        {
        int x = Greenfoot.getRandomNumber(getWidth()-1);
        int y = Greenfoot.getRandomNumber(getHeight()/2);
        addObject(new m3(), x, y);
    }
    }
    
    //se encarga de agregar proteccion1 
    private void addPoder1()
    {
        
            int x = Greenfoot.getRandomNumber(getWidth());
            int y = 10;
            addObject(new poder1(), x, y);
            countpod(1);
     }
     
    //se encarga de agregar proteccion 2 
    private void addPoder2()
    {
            int x = Greenfoot.getRandomNumber(getHeight());
            int y = 10;
            addObject(new poder2(), x, y);
            countpod(1);
    }
    
    //se encarga de agregar proteccion3 
    private void addPoder3()
    {
            int x = Greenfoot.getRandomNumber(getHeight());
            int y = 10;
            addObject(new poder3(), x, y);
            countpod(1);
    }
    //se encarga de añadir una vida al jugador
    private void addPoder4()
    {
            int x = Greenfoot.getRandomNumber(getWidth());
            int y = 10;
            addObject(new poder4(), x, y);
            countpod(1);
     }
    //agreda uno de los 4 poderes dependiendo del random
    private void addpoder()
    {
    if(Greenfoot.getRandomNumber(150)==14)   
     addPoder1();
     if(Greenfoot.getRandomNumber(150)==14) 
     addPoder2();   
     if(Greenfoot.getRandomNumber(150)==14) 
     addPoder3();
     //este es el de las vidas pero solo se activa en el niverl 4   
     if(Greenfoot.getRandomNumber(150)==14&&niv==4) 
     addPoder4();
     
    }
    
    //se encarga de agregar el objeto a recolectar 1
    private void addObjeto1()
    {
        
            int x = Greenfoot.getRandomNumber(getWidth());
            int y = 10;
            addObject(new objeto1(), x, y);
            countpod(1);
     }
     
    //se encarga de agregar el objeto a recolectar 2 
    private void addObjeto2()
    {
            int x = Greenfoot.getRandomNumber(getHeight());
            int y = 10;
            addObject(new objeto2(), x, y);
            countpod(1);
    }
    
    //se encarga de agregar el objeto a recolectar3  
    private void addObjeto3()
    {
            int x = Greenfoot.getRandomNumber(getHeight());
            int y = 10;
            addObject(new objeto3(), x, y);
            countpod(1);
    }
    //agreda uno de los 3 objetos dependiendo del random
    private void addObjeto()
    {
    if(Greenfoot.getRandomNumber(150)==14)   
     addObjeto1();
     if(Greenfoot.getRandomNumber(150)==14) 
     addObjeto2();   
     if(Greenfoot.getRandomNumber(150)==14) 
     addObjeto3(); 
    }
    
    /**los siguientes metodos son para poder acceder a el nivel,las vidas,
     * coordenadas en cualquier clase*/
    //coordenadas de loe enemigos
    public void retx(int o)
    {
        gx=o;
    }
    //coordenadas de enemigos
    public int getx()
    {
        return gx;
    }
    //coordenadas de poderes
    public int getxpod()
    {
        return px;
    }
    //coordenadas de poderes 
    public int getypod()
    {
        return py;
    }
    //coordenadas de poderes
    public void retxpod(int o)
    {
        px=o;
    }
    //coordenadas de poderes
    public void retypod(int c)
    {
        py=c;
    }
    //coordenadas de poderes
    public void countpod(int b)
    {
        pb+=b;
    }
    
    public int cotpod()
    {
        return(pb);
    }
    //resta vidas al heroe
    public void loseLife() 
    {
        lives--;
    }
    
    
     //carga los botones del menu
    public void cargaMenu(){
        setBackground("fondo.jpg");
        addObject(jugar,430,200);
        addObject(ayuda,550,420);
        addObject(creditos,250,400);
        removeObject(atras);
    }
    
    //checa cual boton se a presionado 
    public void checaBotones(){
        
        if(jugar.getPresionado())
        {  
           jugar.setPresionado(false);
           remueveMenu();
           cargaobjetos();
           i=true;
        }
        else 
        if(ayuda.getPresionado())
        {
            ayuda.setPresionado(false);
            remueveMenu();
            setBackground("moon.png");
            addObject(atras,620,40);
        }
        else 
        if(creditos.getPresionado())
        {
            creditos.setPresionado(false);
            remueveMenu();
            setBackground("portada.png");
            addObject(atras,620,540);
        }
        else
        if(atras.getPresionado())
        {
            atras.setPresionado(false);
            cargaMenu();
            i=false;
        }
    }
    
    // se encarga  poner en el mundo los objetos del primer nivel
    public void cargaobjetos()
    {
     setBackground("space1.jpg");
     addObject(heroe,350,550);
     addEnemigo1(20);
     addObject(muestra,40,60);
     addObject(puerta,600,580);
     addObject(panel, 50, 29);     
     addObject(llave, 100, 29);
    }
    
    //se encarga de remover los objetos(botones) del menu
    public void remueveMenu(){
        removeObject(jugar);
        removeObject(ayuda);
        removeObject(creditos);
    }
}